
# 第七周
# 游戏开发 --》  网站开发 网站  一小时 计算机网络 数据结构 Python  LINUX 部署  数据库SQL

import tkinter  # 动画模块  画布
import time
import random


# 定义一个 球的class 类
class Ball():
    # 初始化  功能   参数 属性   球的大小 颜色 球移动  放到画布
    def __init__(self, canvas,paddle,score, color):
        self.canvas = canvas  # 外部画布 传到 Ball类 局部变量  保证 小球 跟画布在一个屏幕
        # 创建一个椭圆 self.id
        self.paddle = paddle
        self.score = score
        self.id = canvas.create_oval(0, 0, 30, 30, fill=color)
        # 小球的初始位置 放在 245,100
        canvas.move(self.id, 245, 100)
        level = [-7, -5, -3, -1, 1, 3, 5, 7]
        self.x = random.choice(level)
        self.y = random.choice(level)
        # 当小球碰到底部变成true停止
        self.hit_bottom = False
    def draw(self):
        self.canvas.move(self.id, self.x, self.y)  # x 水平移动  y 垂直移动速度
        pos = self.canvas.coords(self.id)  # 获取小球的坐标
        # pos = [x1,y1,x2,y2]
        if self.hit_paddle(pos) == True:  # 小球最底部 y2 不断往下 到最底部 400
            self.y = -3  # 设置 y 往上弹 负数
        if pos[3] >= 400:  # 小球最底部 y2 不断往下 到最底部 400
            self.hit_bottom = True  # 设置 y 往上弹 负数
        if pos[1] <= 0:  # 小球最顶部y1  不断往上 减小 到最顶部 0
            self.y = 3  # 设置y 为正数 往下弹
        if pos[0] <= 0:  # 当小球的最左边 x1 不断往左 减小 到最左边 0
            self.x = 3  # 设置 x 为正数 往右弹
        if pos[2] >= 500:
            self.x = -3
    #定义一个 球拍 击打到小球函数，之后 只要球拍打到小球，调用这个函数
    def hit_paddle(self,pos): #把小球的坐标 和球拍的坐标 进行碰撞 运算
        paddle_pos = self.canvas.coords(self.paddle.id) #获取球拍到坐标 外部变量传参 把球拍传进来这个函数
        #当球拍打到小球上的时候，必须满足什么条件
        #水平方向上 小球的最右边 大于球拍的最左边
        if pos[2]>=paddle_pos[0] and pos[0]<= paddle_pos[2]:
            if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]:
                self.x =self.paddle.x + self.x
                self.score.hit()
                return True#球拍打到小球上
            #垂直方向 小球的最底部 y2 一定在球拍的最上面 y1 y1>小球y2 y2 小于 球拍的 y2
        return False


class Paddle():
    def __init__(self, canvas, color):
        self.canvas = canvas  # 外部画布 传到 Ball类 局部变量  保证 小球 跟画布在一个屏幕
        # 创建一个椭圆 self.id
        self.id = canvas.create_rectangle(0, 0, 150, 20, fill=color)
        canvas.move(self.id,100,350)
        self.x = 0
        self.y = 0
        # 监听球拍 方向键盘  一旦按下方向 向左按钮 让球拍向左移 右边同理
        self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
        # 监听全部 方向键按下，则执行后面的函数
        self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
        #self.canvas.bind_all('<KeyPress-Up>',self.turn_up)
        #self.canvas.bind_all('<KeyPress-Down>',self.turn_down)
        self.canvas.bind_all('<Key>',self.start_game)
        #按下任意键 开始游戏
        self.start = False
    def start_game(self,evt):
        self.start = True

    def draw(self):
        self.canvas.move(self.id, self.x, self.y)  # x 水平移动  y 垂直移动速度
        pos = self.canvas.coords(self.id)  # 获取小球的坐标
        if pos[0] <= 0:  # 当小球的最左边 x1 不断往左 减小 到最左边 0
            self.x = 3  # 设置 x 为正数 往右弹
        if pos[2] >= 500:
            self.x = -3
        if pos[3] >= 400:  # 当小球的最左边 x1 不断往左 减小 到最左边 0
            self.x = 3  # 设置 x 为正数 往右弹
        if pos[1] <= 0:
            self.x = -3
    def turn_left(self,evt):
        self.x = -3
    def turn_right(self,evt):
        self.x = 3
    #def turn_up(self,evt):
     #   self.y= -3
    #def turn_down(self,evt):
      #  self.y= 3


class Score():
    def __init__(self, canvas, color):
        self.canvas = canvas  # 外部画布 传到 Ball类 局部变量  保证 小球 跟画布在一个屏幕
        self.score = 0
        # 创建一个椭圆 self.id
        self.id = canvas.create_text(450, 20,text = self.score, fill=color)
       # canvas.move(self.id,450,20) # 文字初始化放在屏幕的位置

    def hit(self):
        self.score = self.score + 2
        canvas.itemconfig(self.id,text = self.score)



tk = tkinter.Tk()  # 把动画模块实例化出来  tk 窗口动画
tk.title("第一个自己学的小游戏")
tk.resizable(0, 0)
tk.wm_attributes('-topmost', 1)  # 窗口置前

# 创建一个画布 宽为500 高为400  实例化 画布
canvas = tkinter.Canvas(tk, width=500, height=400)
# 画布打包 看的见
canvas.pack()
tk.update()
score = Score(canvas,"red")
paddle = Paddle(canvas,"blue")
ball = Ball(canvas,paddle,score, "red")
game_over_text = canvas.create_text(250,200,text = "游戏结束" ,font=('Arial',28),state = 'hidden')


# while 1 不断执行 无限循环
while 1:
    if ball.hit_bottom == False  and paddle.start == True :
        ball.draw()  # 让球移动
        paddle.draw()  # 让球拍移动
    if  ball.hit_bottom == True:
        canvas.itemconfig(game_over_text,state = 'normal')

    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)